package api

import (
	"net/http"
	"pids-cloud-server/app/common"
	"pids-cloud-server/app/middleware"
	"pids-cloud-server/entity"
	"pids-cloud-server/utils"

	"github.com/gin-gonic/gin"
)

// GetSnmpList 获取SNMP信息列表
// @Summary 获取SNMP信息列表
// @Description 获取SNMP信息列表,支持按IP、设备类型和启用状态筛选
// @Tags SNMP设备信息
// @Accept json
// @Produce json
// @Param page query int false "页码，默认1"
// @Param pageSize query int false "每页大小，默认10"
// @Param ip query string false "设备IP"
// @Param type query string false "设备类型(1:服务器,2:交换机,3:PDU,4:播控器,9:NTP,10:网络设备)"
// @Param enable query string false "启用状态(0:禁用,1:启用)"
// @Success 200 {object} common.Result{data=common.PageResult{list=[]entity.SnmpInfo}} "成功"
// @Failure 500 {object} common.Result "失败"
// @Router /snmp/list [get]
func GetSnmpList(c *gin.Context) {
	// 从上下文中获取分页参数
	pagination, _ := c.Get("pagination")
	paging := pagination.(*middleware.PaginationParams)

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, http.StatusInternalServerError, "数据库连接失败")
		return
	}
	// 获取查询参数
	ip := c.Query("ip")
	typeStr := c.Query("type")
	enableStr := c.Query("enable")

	// 构建查询条件
	query := db.Model(&entity.SnmpInfo{})
	if ip != "" {
		query = query.Where("ip LIKE ?", "%"+ip+"%")
	}
	if typeStr != "" {
		query = query.Where("type = ?", typeStr)
	}
	if enableStr != "" {
		query = query.Where("enable = ?", enableStr)
	}

	// 获取总记录数
	var total int64
	if err := query.Count(&total).Error; err != nil {
		common.ErrorResponse(c, 500, "查询失败")
		return
	}

	// 获取分页数据
	var snmpList []entity.SnmpInfo
	if err := query.Offset((paging.Page - 1) * paging.PageSize).Limit(paging.PageSize).Find(&snmpList).Error; err != nil {
		common.ErrorResponse(c, 500, "查询失败")
		return
	}

	common.SuccessPageResponse(c, snmpList, total, paging.Page, paging.PageSize)
}

// AddSnmpInfo 新增SNMP信息
// @Summary 新增SNMP信息
// @Description 新增一条SNMP信息
// @Tags SNMP设备信息
// @Accept json
// @Produce json
// @Param snmpInfo body entity.SnmpInfo true "SNMP信息"
// @Success 200 {object} common.Result{data=entity.SnmpInfo} "成功"
// @Failure 400 {object} common.Result "参数错误"
// @Failure 500 {object} common.Result "新增失败"
// @Router /api/snmp/add [post]
func AddSnmpInfo(c *gin.Context) {
	var snmpInfo entity.SnmpInfo
	if err := c.ShouldBindJSON(&snmpInfo); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "参数错误",
			"data":    nil,
		})
		return
	}

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, http.StatusInternalServerError, "数据库连接失败")
		return
	}
	if err := db.Create(&snmpInfo).Error; err != nil {
		common.ErrorResponse(c, 500, "新增失败!")
	} else {
		common.SuccessResponse(c, snmpInfo)
	}
}

// UpdateSnmpInfo 更新SNMP信息
// @Summary 更新SNMP信息
// @Description 更新SNMP信息
// @Tags SNMP设备信息
// @Accept json
// @Produce json
// @Param updateData body map[string]interface{} true "更新数据，必须包含id字段"
// @Success 200 {object} common.Result "成功"
// @Failure 400 {object} common.Result "参数错误"
// @Failure 500 {object} common.Result "更新失败"
// @Router /api/snmp/update [put]
func UpdateSnmpInfo(c *gin.Context) {
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "参数错误",
			"data":    nil,
		})
		return
	}

	id, ok := updateData["id"].(float64)
	if !ok {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "ID 参数错误",
			"data":    nil,
		})
		return
	}

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, http.StatusInternalServerError, "数据库连接失败")
		return
	}
	if err := db.Model(&entity.SnmpInfo{}).Where("id = ?", int(id)).Updates(updateData).Error; err != nil {
		common.ErrorResponse(c, 500, "更新失败!")
		return
	}

	common.SuccessResponse(c, nil)
}

// DeleteSnmpInfo 删除SNMP信息
// @Summary 删除SNMP信息
// @Description 根据ID删除SNMP信息
// @Tags SNMP设备信息
// @Accept json
// @Produce json
// @Param id path string true "SNMP信息ID"
// @Success 200 {object} common.Result "成功"
// @Failure 500 {object} common.Result "删除失败"
// @Router /api/snmp/delete/{id} [delete]
func DeleteSnmpInfo(c *gin.Context) {
	id := c.Param("id")

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, http.StatusInternalServerError, "数据库连接失败")
		return
	}
	if err := db.Delete(&entity.SnmpInfo{}, id).Error; err != nil {
		common.ErrorResponse(c, 500, "删除失败!")
		return
	}
	common.SuccessResponse(c, gin.H{})
}
